1 街景图像最常用的两个指标:天空率与绿视率
\[Sky\ view\ index = \frac{number\ of\
sky\ pixel}{number\ of\ the\ total\ pixel\ in\ single\ street\ view\
image}\]
\[Green\ view\ index = \frac{number\ of\
green\ pixel}{number\ of\ the\ total\ pixel\ in\ single\ street\ view\
image}\]
2 R语言及Rstudio简介
以下相关简介文字为Kimi生成
R语言是一种开源的编程语言,专为统计计算和图形而设计。它由统计学家
Ross Ihaka 和 Robert
Gentleman于1993年开发,并由全球开发者社区不断扩展。R语言支持多种操作系统,提供丰富的统计分析方法,包括线性回归、时间序列分析、聚类分析等,可处理各种数据类型,如表格数据、空间数据等。它还具备强大的数据可视化功能,通过
base
R和扩展包(如ggplot2、lattice)生成高质量图表,包括散点图、直方图、箱线图等。此外,R语言拥有庞大且活跃的社区,提供大量免费资源和支持,可通过
CRAN获取数千个扩展包,以增强其功能。R语言被广泛应用于学术研究、数据分析、金融建模、生物信息学等多个领域,助力用户高效完成复杂数据任务。
R语言官网
RStudio 是一款集成开发环境(IDE),专为 R 语言设计,于 2009 年由
RStudio团队首次发布。它提供了一个用户友好的界面,包含代码编辑器、工作区管理、图形显示和帮助文档等功能,支持多操作系统,兼容R的所有版本和包。RStudio的免费社区版适合各类用户,还有专业版和服务器版满足高级需求。它凭借直观界面和丰富功能,极大地提升了
R 编程效率,成为分析师、研究人员和数据科学家的首选工具,推动了 R
语言的普及。
官网链接
相关R语言资源介绍
3 相关的R语言及Rstudio安装
Windows下R语言及相关的软件安装比较简单。只需要从下面的几个链接下载对应的exe安装包,一路安装到底即可。注意R语言版本和Rtools版本要对应。Rtools是一个辅助安装R语言包的工具。
4 相关的R语言包安装
安装好以上软件以后,打开Rstudio。经典的Rstudio是一个四等分界面。左上角是写代码/Rnotebook的地方,左下角是代码执行输出的终端平台,右上角R语言运行以后的数据集以及变量相关的查看窗口,右下角一般是路径,可视化图的结果,以及GUI的R语言包安装工具等。
本次实践需要的包一共三个,分别是jpeg,countcolors与colorsdistance。
有两种方式安装R语言包,一种是在左下角运行如下的code。
install.packages('jpeg')
install.packages('countcolors')
install.packages('colordistance')
或者也可以在右下角的界面点击‘Packages→Install’,然后会跳出一个界面,输入包的名字即可。
5 R语言代码实操
载入包并读取街景图片。
library(countcolors)
library(colordistance)
library(jpeg)
svi <- readJPEG("E:/ShaoqingDai/project/urbansensing&bea_material/data/0_svibd_0_202002_0_0.jpg")
简单可视化街景图片。
plot(as.raster(svi))

colordistance需要用loadImage来读取。将图片的RGB波段绘制在三维坐标图上,n为采样点(这样可以看到图片在RGB三个频道里的点分布是如何的),建议不超过20000便于提升速度。
svii <- loadImage("E:/ShaoqingDai/project/urbansensing&bea_material/data/0_svibd_0_202002_0_0.jpg")
plotPixels(svii, n = 5000)

本次采用的是较为简单的通过像素值来划定天空和绿色空间的方法。也就是我们设定我们感兴趣的要素的像素值取值范围,即可以快速提取相关的像素以及计算比例指标。这个计算是通过R语言包countcolors来操作的。这个包其实函数也很简单,主要的函数就是两个,一个是rectangularRange,一个是spericalRange。这两个函数的类型很像GIS中如何提取坐标。前者rectangularRange相当于在上面的三维图是画一个矩形,也就是给出左上角和右下角两个点的坐标值,来划定要提取的像素范围。后者的specialRange,顾名思义是球形取值像素,所以就是提供中心点的坐标值,以及取值半径,与空间分析中的缓冲区分析是类似的。至于怎么像素的RGB值怎么获取,在相关的图片处理软件或者word,powerpoint里都可以做到(用取色器)。这里提供例子给大家尝试。
5.1 基于rectangularRange提取
我们预设了一个阈值,这个阈值可以根据上面解释的。大家通过在相关软件里自己取色调整阈值。我们预设的范围基本是偏向于绿色的部分,所以是绿视率的简易计算。提取R波段在0.2-0.3之间,G波段在0.35-0.55之间,B波段在0.2-0.3之间的像素(注意这里RGB不是0-255,而是0-1,所以取完色大家记得除以255做转换)。
lower.rectangular <- c(0.2, 0.35, 0.2)
upper.rectangular <- c(0.3, 0.55, 0.3)
# 指定掩盖色为红色
svi.rectangular <- rectangularRange(svi, upper = c(0.55, 0.75, 0.4), lower = c(0.1, 0.25, 0), target.color = "red", plotting = T)

得到图片中指定像素的比例:0.1120758。
svi.rectangular$img.fraction
[1] 0.1120758
5.2 基于spericalRange提取
就如同上面所说。这里预设的阈值是提取某个建筑物上红色窗口。spercialRange的半径其实是一个比较敏感的参数。
center.spherical <- c(255, 75, 75)/255
svi.spherical <- sphericalRange(svi, center = center.spherical, radius = 0.2, target.color = 'blue', plotting = T)

半径太低。
center.spherical <- c(255, 75, 75)/255
svi.spherical <- sphericalRange(svi, center = center.spherical, radius = 0.05, target.color = 'blue', plotting = T)

半径过高。
center.spherical <- c(255, 75, 75)/255
svi.spherical <- sphericalRange(svi, center = center.spherical, radius = 0.4, target.color = 'blue', plotting = T)

得到图片中指定像素的比例:0.00103569。
svi.spherical$img.fraction
[1] 0.00103569
6 作业以及Q&A
6.1 课后作业
- 本次课程数据集中给了另一张植被覆盖比较多的样例图像,可以就那张街景图像进行分割计算。
- 探索不同阈值提取相关要素。
- 结合R语言的for循环实现批量街景图像相关天空率与绿视率的计算。
LS0tDQp0aXRsZTogIuOAiuWfjuW4guiwg+afpeOAi+ivvueoi+S4iuacuuWunui3teKAlOKAlOWfuuS6jlLor63oqIDnmoTooZfmma/lm77lg4/lpKnnqbrnjofkuI7nu7/op4bnjofnroDmmJPorqHnrpciDQphdXRob3I6IOaItOWKreWLjQ0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazogDQogICAgdG9jOiB0cnVlDQotLS0NCg0KIyAxIOihl+aZr+WbvuWDj+acgOW4uOeUqOeahOS4pOS4quaMh+agh++8muWkqeepuueOh+S4jue7v+inhueOhw0KDQokJFNreVwgdmlld1wgaW5kZXggPSBcZnJhY3tudW1iZXJcIG9mXCBza3lcIHBpeGVsfXtudW1iZXJcIG9mXCB0aGVcIHRvdGFsXCBwaXhlbFwgaW5cIHNpbmdsZVwgc3RyZWV0XCB2aWV3XCBpbWFnZX0kJA0KDQokJEdyZWVuXCB2aWV3XCBpbmRleCA9IFxmcmFje251bWJlclwgb2ZcIGdyZWVuXCBwaXhlbH17bnVtYmVyXCBvZlwgdGhlXCB0b3RhbFwgcGl4ZWxcIGluXCBzaW5nbGVcIHN0cmVldFwgdmlld1wgaW1hZ2V9JCQNCg0KIyAyIFLor63oqIDlj4pSc3R1ZGlv566A5LuLDQoNCmBgYOS7peS4i+ebuOWFs+eugOS7i+aWh+Wtl+S4uktpbWnnlJ/miJBgYGANCg0KUuivreiogOaYr+S4gOenjeW8gOa6kOeahOe8lueoi+ivreiogO+8jOS4k+S4uue7n+iuoeiuoeeul+WSjOWbvuW9ouiAjOiuvuiuoeOAguWug+eUsee7n+iuoeWtpuWutiBSb3NzIEloYWthIOWSjCBSb2JlcnQgR2VudGxlbWFu5LqOMTk5M+W5tOW8gOWPke+8jOW5tueUseWFqOeQg+W8gOWPkeiAheekvuWMuuS4jeaWreaJqeWxleOAglLor63oqIDmlK/mjIHlpJrnp43mk43kvZzns7vnu5/vvIzmj5DkvpvkuLDlr4znmoTnu5/orqHliIbmnpDmlrnms5XvvIzljIXmi6znur/mgKflm57lvZLjgIHml7bpl7Tluo/liJfliIbmnpDjgIHogZrnsbvliIbmnpDnrYnvvIzlj6/lpITnkIblkITnp43mlbDmja7nsbvlnovvvIzlpoLooajmoLzmlbDmja7jgIHnqbrpl7TmlbDmja7nrYnjgILlroPov5jlhbflpIflvLrlpKfnmoTmlbDmja7lj6/op4bljJblip/og73vvIzpgJrov4cgYmFzZSBS5ZKM5omp5bGV5YyF77yI5aaCZ2dwbG90MuOAgWxhdHRpY2XvvInnlJ/miJDpq5jotKjph4/lm77ooajvvIzljIXmi6zmlaPngrnlm77jgIHnm7Tmlrnlm77jgIHnrrHnur/lm77nrYnjgILmraTlpJbvvIxS6K+t6KiA5oul5pyJ5bqe5aSn5LiU5rS76LeD55qE56S+5Yy677yM5o+Q5L6b5aSn6YeP5YWN6LS56LWE5rqQ5ZKM5pSv5oyB77yM5Y+v6YCa6L+HIENSQU7ojrflj5bmlbDljYPkuKrmianlsZXljIXvvIzku6Xlop7lvLrlhbblip/og73jgIJS6K+t6KiA6KKr5bm/5rOb5bqU55So5LqO5a2m5pyv56CU56m244CB5pWw5o2u5YiG5p6Q44CB6YeR6J6N5bu65qih44CB55Sf54mp5L+h5oGv5a2m562J5aSa5Liq6aKG5Z+f77yM5Yqp5Yqb55So5oi36auY5pWI5a6M5oiQ5aSN5p2C5pWw5o2u5Lu75Yqh44CCDQoNCg0KDQpbUuivreiogOWumOe9kV0oaHR0cHM6Ly93d3cuci1wcm9qZWN0Lm9yZy8pDQoNClJTdHVkaW8g5piv5LiA5qy+6ZuG5oiQ5byA5Y+R546v5aKD77yISURF77yJ77yM5LiT5Li6IFIg6K+t6KiA6K6+6K6h77yM5LqOIDIwMDkg5bm055SxIFJTdHVkaW/lm6LpmJ/pppbmrKHlj5HluIPjgILlroPmj5DkvpvkuobkuIDkuKrnlKjmiLflj4vlpb3nmoTnlYzpnaLvvIzljIXlkKvku6PnoIHnvJbovpHlmajjgIHlt6XkvZzljLrnrqHnkIbjgIHlm77lvaLmmL7npLrlkozluK7liqnmlofmoaPnrYnlip/og73vvIzmlK/mjIHlpJrmk43kvZzns7vnu5/vvIzlhbzlrrlS55qE5omA5pyJ54mI5pys5ZKM5YyF44CCUlN0dWRpb+eahOWFjei0ueekvuWMuueJiOmAguWQiOWQhOexu+eUqOaIt++8jOi/mOacieS4k+S4mueJiOWSjOacjeWKoeWZqOeJiOa7oei2s+mrmOe6p+mcgOaxguOAguWug+WHreWAn+ebtOingueVjOmdouWSjOS4sOWvjOWKn+iDve+8jOaegeWkp+WcsOaPkOWNh+S6hiBSIOe8lueoi+aViOeOh++8jOaIkOS4uuWIhuaekOW4iOOAgeeglOeptuS6uuWRmOWSjOaVsOaNruenkeWtpuWutueahOmmlumAieW3peWFt++8jOaOqOWKqOS6hiBSIOivreiogOeahOaZruWPiuOAgg0KDQpb5a6Y572R6ZO+5o6lXShodHRwczovL3Bvc2l0LmNvL2Rvd25sb2Fkcy8pDQoNCuebuOWFs1Lor63oqIDotYTmupDku4vnu40NCg0KPi0gW+WbveWGheacgOWkp+eahFLor63oqIDnpL7ljLrigJTigJTnu5/orqHkuYvpg71dKGh0dHBzOi8vY29zLm5hbWUvKQ0KPi0gW+W6lOeUqOe7n+iuoeWtpuS4jlLor63oqIDlrp7njrDlrabkuaDnrJTorrAo5ZCr5YiG5p6Q5rqQ56CBKV0oaHR0cHM6Ly9naXRodWIuY29tL0dJU2VyRGFpU2hhb3FpbmcvTm90ZS1vZi1BcHBsaWVkLVN0YXRpc3RpY3Mtd2l0aC1SKQ0KPi0gW+W6lOeUqOe7n+iuoeWtpuS4jlLor63oqIDlrp7njrDlrabkuaDnrJQo5Zyo57q/55S15a2Q5LmmKV0oaHR0cHM6Ly9naXNlcnNxZGFpLnRvcC9Ob3RlLW9mLUFwcGxpZWQtU3RhdGlzdGljcy13aXRoLVItQm9vay8pDQoNCg0KIyAzIOebuOWFs+eahFLor63oqIDlj4pSc3R1ZGlv5a6J6KOFDQoNCldpbmRvd3PkuItS6K+t6KiA5Y+K55u45YWz55qE6L2v5Lu25a6J6KOF5q+U6L6D566A5Y2V44CC5Y+q6ZyA6KaB5LuO5LiL6Z2i55qE5Yeg5Liq6ZO+5o6l5LiL6L295a+55bqU55qEZXhl5a6J6KOF5YyF77yM5LiA6Lev5a6J6KOF5Yiw5bqV5Y2z5Y+v44CC5rOo5oSPUuivreiogOeJiOacrOWSjFJ0b29sc+eJiOacrOimgeWvueW6lOOAglJ0b29sc+aYr+S4gOS4qui+heWKqeWuieijhVLor63oqIDljIXnmoTlt6XlhbfjgIINCg0KPi0gW1Lor63oqIDlronoo4XljIXkuIvovb3pk77mjqVdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL2Jpbi93aW5kb3dzL2Jhc2UvKQ0KPi0gW1J0b29sc+WuieijheWMheS4i+i9vemTvuaOpV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvYmluL3dpbmRvd3MvUnRvb2xzLykNCj4tIFtSc3R1ZGlv5a6J6KOF5YyF5LiL6L296ZO+5o6lXShodHRwczovL3Bvc2l0LmNvL2Rvd25sb2Fkcy8pDQoNCiMgNCDnm7jlhbPnmoRS6K+t6KiA5YyF5a6J6KOFDQoNCuWuieijheWlveS7peS4iui9r+S7tuS7peWQju+8jOaJk+W8gFJzdHVkaW/jgILnu4/lhbjnmoRSc3R1ZGlv5piv5LiA5Liq5Zub562J5YiG55WM6Z2i44CC5bem5LiK6KeS5piv5YaZ5Luj56CBL1Jub3RlYm9va+eahOWcsOaWue+8jOW3puS4i+inkuaYr+S7o+eggeaJp+ihjOi+k+WHuueahOe7iOerr+W5s+WPsO+8jOWPs+S4iuinklLor63oqIDov5DooYzku6XlkI7nmoTmlbDmja7pm4bku6Xlj4rlj5jph4/nm7jlhbPnmoTmn6XnnIvnqpflj6PvvIzlj7PkuIvop5LkuIDoiKzmmK/ot6/lvoTvvIzlj6/op4bljJblm77nmoTnu5PmnpzvvIzku6Xlj4pHVUnnmoRS6K+t6KiA5YyF5a6J6KOF5bel5YW3562J44CCDQoNCuacrOasoeWunui3temcgOimgeeahOWMheS4gOWFseS4ieS4qu+8jOWIhuWIq+aYr2pwZWfvvIxjb3VudGNvbG9yc+S4jmNvbG9yc2Rpc3RhbmNl44CCDQoNCuacieS4pOenjeaWueW8j+WuieijhVLor63oqIDljIXvvIzkuIDnp43mmK/lnKjlt6bkuIvop5Lov5DooYzlpoLkuIvnmoRjb2Rl44CCDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygnanBlZycpDQppbnN0YWxsLnBhY2thZ2VzKCdjb3VudGNvbG9ycycpDQppbnN0YWxsLnBhY2thZ2VzKCdjb2xvcmRpc3RhbmNlJykNCmBgYA0KDQrmiJbogIXkuZ/lj6/ku6XlnKjlj7PkuIvop5LnmoTnlYzpnaLngrnlh7vigJhQYWNrYWdlc+KGkkluc3RhbGzigJnvvIznhLblkI7kvJrot7Plh7rkuIDkuKrnlYzpnaLvvIzovpPlhaXljIXnmoTlkI3lrZfljbPlj6/jgIINCg0KIyA1IFLor63oqIDku6PnoIHlrp7mk40NCg0K6L295YWl5YyF5bm26K+75Y+W6KGX5pmv5Zu+54mH44CCDQoNCmBgYHtyfQ0KbGlicmFyeShjb3VudGNvbG9ycykNCmxpYnJhcnkoY29sb3JkaXN0YW5jZSkNCmxpYnJhcnkoanBlZykNCg0Kc3ZpIDwtIHJlYWRKUEVHKCJFOi9TaGFvcWluZ0RhaS9wcm9qZWN0L3VyYmFuc2Vuc2luZyZiZWFfbWF0ZXJpYWwvZGF0YS8wX3N2aWJkXzBfMjAyMDAyXzBfMC5qcGciKQ0KYGBgDQoNCueugOWNleWPr+inhuWMluihl+aZr+WbvueJh+OAgg0KDQpgYGB7cn0NCnBsb3QoYXMucmFzdGVyKHN2aSkpDQpgYGANCmNvbG9yZGlzdGFuY2XpnIDopoHnlKhsb2FkSW1hZ2XmnaXor7vlj5bjgILlsIblm77niYfnmoRSR0Lms6LmrrXnu5jliLblnKjkuInnu7TlnZDmoIflm77kuIrvvIxu5Li66YeH5qC354K577yI6L+Z5qC35Y+v5Lul55yL5Yiw5Zu+54mH5ZyoUkdC5LiJ5Liq6aKR6YGT6YeM55qE54K55YiG5biD5piv5aaC5L2V55qE77yJ77yM5bu66K6u5LiN6LaF6L+HMjAwMDDkvr/kuo7mj5DljYfpgJ/luqbjgIINCg0KYGBge3J9DQpzdmlpIDwtIGxvYWRJbWFnZSgiRTovU2hhb3FpbmdEYWkvcHJvamVjdC91cmJhbnNlbnNpbmcmYmVhX21hdGVyaWFsL2RhdGEvMF9zdmliZF8wXzIwMjAwMl8wXzAuanBnIikNCg0KcGxvdFBpeGVscyhzdmlpLCBuID0gNTAwMCkNCmBgYA0K5pys5qyh6YeH55So55qE5piv6L6D5Li6566A5Y2V55qE6YCa6L+H5YOP57Sg5YC85p2l5YiS5a6a5aSp56m65ZKM57u/6Imy56m66Ze055qE5pa55rOV44CC5Lmf5bCx5piv5oiR5Lus6K6+5a6a5oiR5Lus5oSf5YW06Laj55qE6KaB57Sg55qE5YOP57Sg5YC85Y+W5YC86IyD5Zu077yM5Y2z5Y+v5Lul5b+r6YCf5o+Q5Y+W55u45YWz55qE5YOP57Sg5Lul5Y+K6K6h566X5q+U5L6L5oyH5qCH44CC6L+Z5Liq6K6h566X5piv6YCa6L+HUuivreiogOWMhWNvdW50Y29sb3Jz5p2l5pON5L2c55qE44CC6L+Z5Liq5YyF5YW25a6e5Ye95pWw5Lmf5b6I566A5Y2V77yM5Li76KaB55qE5Ye95pWw5bCx5piv5Lik5Liq77yM5LiA5Liq5pivcmVjdGFuZ3VsYXJSYW5nZe+8jOS4gOS4quaYr3NwZXJpY2FsUmFuZ2XjgILov5nkuKTkuKrlh73mlbDnmoTnsbvlnovlvojlg49HSVPkuK3lpoLkvZXmj5Dlj5blnZDmoIfjgILliY3ogIVyZWN0YW5ndWxhclJhbmdl55u45b2T5LqO5Zyo5LiK6Z2i55qE5LiJ57u05Zu+5piv55S75LiA5Liq55+p5b2i77yM5Lmf5bCx5piv57uZ5Ye65bem5LiK6KeS5ZKM5Y+z5LiL6KeS5Lik5Liq54K555qE5Z2Q5qCH5YC877yM5p2l5YiS5a6a6KaB5o+Q5Y+W55qE5YOP57Sg6IyD5Zu044CC5ZCO6ICF55qEc3BlY2lhbFJhbmdl77yM6aG+5ZCN5oCd5LmJ5piv55CD5b2i5Y+W5YC85YOP57Sg77yM5omA5Lul5bCx5piv5o+Q5L6b5Lit5b+D54K555qE5Z2Q5qCH5YC877yM5Lul5Y+K5Y+W5YC85Y2K5b6E77yM5LiO56m66Ze05YiG5p6Q5Lit55qE57yT5Yay5Yy65YiG5p6Q5piv57G75Ly855qE44CC6Iez5LqO5oCO5LmI5YOP57Sg55qEUkdC5YC85oCO5LmI6I635Y+W77yM5Zyo55u45YWz55qE5Zu+54mH5aSE55CG6L2v5Lu25oiW6ICFd29yZO+8jHBvd2VycG9pbnTph4zpg73lj6/ku6XlgZrliLDvvIjnlKjlj5boibLlmajvvInjgILov5nph4zmj5DkvpvkvovlrZDnu5nlpKflrrblsJ3or5XjgIINCg0KIyMgNS4xIOWfuuS6jnJlY3Rhbmd1bGFyUmFuZ2Xmj5Dlj5YNCuaIkeS7rOmihOiuvuS6huS4gOS4qumYiOWAvO+8jOi/meS4qumYiOWAvOWPr+S7peagueaNruS4iumdouino+mHiueahOOAguWkp+WutumAmui/h+WcqOebuOWFs+i9r+S7tumHjOiHquW3seWPluiJsuiwg+aVtOmYiOWAvOOAguaIkeS7rOmihOiuvueahOiMg+WbtOWfuuacrOaYr+WBj+WQkeS6jue7v+iJsueahOmDqOWIhu+8jOaJgOS7peaYr+e7v+inhueOh+eahOeugOaYk+iuoeeul+OAguaPkOWPllLms6LmrrXlnKgwLjItMC4z5LmL6Ze077yMR+azouauteWcqDAuMzUtMC41NeS5i+mXtO+8jELms6LmrrXlnKgwLjItMC4z5LmL6Ze055qE5YOP57Sg77yI5rOo5oSP6L+Z6YeMUkdC5LiN5pivMC0yNTXvvIzogIzmmK8wLTHvvIzmiYDku6Xlj5blrozoibLlpKflrrborrDlvpfpmaTku6UyNTXlgZrovazmjaLvvInjgIINCg0KYGBge3J9DQpsb3dlci5yZWN0YW5ndWxhciA8LSBjKDAuMiwgMC4zNSwgMC4yKSAgDQp1cHBlci5yZWN0YW5ndWxhciA8LSBjKDAuMywgMC41NSwgMC4zKSAgDQoNCiMg5oyH5a6a5o6p55uW6Imy5Li657qi6ImyDQpzdmkucmVjdGFuZ3VsYXIgPC0gcmVjdGFuZ3VsYXJSYW5nZShzdmksIHVwcGVyID0gYygwLjU1LCAwLjc1LCAwLjQpLCBsb3dlciA9IGMoMC4xLCAwLjI1LCAwKSwgdGFyZ2V0LmNvbG9yID0gInJlZCIsIHBsb3R0aW5nID0gVCkgDQpgYGANCg0K5b6X5Yiw5Zu+54mH5Lit5oyH5a6a5YOP57Sg55qE5q+U5L6L77yaMC4xMTIwNzU444CCDQoNCmBgYHtyfQ0Kc3ZpLnJlY3Rhbmd1bGFyJGltZy5mcmFjdGlvbiANCmBgYA0KIyMgNS4yIOWfuuS6jnNwZXJpY2FsUmFuZ2Xmj5Dlj5YNCg0K5bCx5aaC5ZCM5LiK6Z2i5omA6K+044CC6L+Z6YeM6aKE6K6+55qE6ZiI5YC85piv5o+Q5Y+W5p+Q5Liq5bu6562R54mp5LiK57qi6Imy56qX5Y+j44CCc3BlcmNpYWxSYW5nZeeahOWNiuW+hOWFtuWunuaYr+S4gOS4quavlOi+g+aVj+aEn+eahOWPguaVsOOAgg0KDQpgYGB7cn0NCmNlbnRlci5zcGhlcmljYWwgPC0gYygyNTUsIDc1LCA3NSkvMjU1DQpzdmkuc3BoZXJpY2FsIDwtIHNwaGVyaWNhbFJhbmdlKHN2aSwgY2VudGVyID0gY2VudGVyLnNwaGVyaWNhbCwgcmFkaXVzID0gMC4yLCB0YXJnZXQuY29sb3IgPSAnYmx1ZScsIHBsb3R0aW5nID0gVCkNCmBgYA0KDQrljYrlvoTlpKrkvY7jgIINCg0KYGBge3J9DQpjZW50ZXIuc3BoZXJpY2FsIDwtIGMoMjU1LCA3NSwgNzUpLzI1NQ0Kc3ZpLnNwaGVyaWNhbCA8LSBzcGhlcmljYWxSYW5nZShzdmksIGNlbnRlciA9IGNlbnRlci5zcGhlcmljYWwsIHJhZGl1cyA9IDAuMDUsIHRhcmdldC5jb2xvciA9ICdibHVlJywgcGxvdHRpbmcgPSBUKQ0KYGBgDQoNCuWNiuW+hOi/h+mrmOOAgg0KDQpgYGB7cn0NCmNlbnRlci5zcGhlcmljYWwgPC0gYygyNTUsIDc1LCA3NSkvMjU1DQpzdmkuc3BoZXJpY2FsIDwtIHNwaGVyaWNhbFJhbmdlKHN2aSwgY2VudGVyID0gY2VudGVyLnNwaGVyaWNhbCwgcmFkaXVzID0gMC40LCB0YXJnZXQuY29sb3IgPSAnYmx1ZScsIHBsb3R0aW5nID0gVCkNCmBgYA0KDQrlvpfliLDlm77niYfkuK3mjIflrprlg4/ntKDnmoTmr5TkvovvvJowLjAwMTAzNTY544CCDQoNCmBgYHtyfQ0Kc3ZpLnNwaGVyaWNhbCRpbWcuZnJhY3Rpb24gDQpgYGANCg0KDQojIDYg5L2c5Lia5Lul5Y+KUSZBDQoNCiMjIDYuMSDor77lkI7kvZzkuJoNCg0KPi0g5pys5qyh6K++56iL5pWw5o2u6ZuG5Lit57uZ5LqG5Y+m5LiA5byg5qSN6KKr6KaG55uW5q+U6L6D5aSa55qE5qC35L6L5Zu+5YOP77yM5Y+v5Lul5bCx6YKj5byg6KGX5pmv5Zu+5YOP6L+b6KGM5YiG5Ymy6K6h566X44CCDQo+LSDmjqLntKLkuI3lkIzpmIjlgLzmj5Dlj5bnm7jlhbPopoHntKDjgIINCj4tIOe7k+WQiFLor63oqIDnmoRmb3Llvqrnjq/lrp7njrDmibnph4/ooZfmma/lm77lg4/nm7jlhbPlpKnnqbrnjofkuI7nu7/op4bnjofnmoTorqHnrpfjgIINCg0KDQojIyA2LjIgUSZBDQoNCuacieS7u+S9lemXrumimOWPr+S7pemAmui/h+mCruS7tuiBlOezuyhzaGFvcWluZy5kYWlcQG91dGxvb2suY29tKeOAgg0KDQrlj4LogIPpk77mjqU6DQoNCltSIGNvdW50Y29sb3Jz5YyF77ya5YOP57Sg57qn5YiG5p6Q5aSE55CG5Zu+54mHXShodHRwczovL2Jsb2cuY3Nkbi5uZXQva01EOGQ1Ui9hcnRpY2xlL2RldGFpbHMvODY1MTk5ODUpDQo=